#include<bits/stdc++.h>
#define ls (x<<1)
#define rs ((x<<1)+1)
#define mid ((l+r)>>1)
using namespace std;
char buf[(1<<21)+5],*p1,*p2;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
int read(){
	int f=0,x=0;
	char ch=getchar();
	while(!isdigit(ch)){f|=(ch=='-');ch=getchar();}
	while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
	return f?-x:x;
}
const int P=147744151;
int n,m,mod,T,ans;
int a[1005][1005];
int tree[4005][4005];
void build0(int w,int L,int x,int l,int r){
	if(l==r){
		tree[w][x]=a[l][L];
		return;
	}
	build0(w,L,ls,l,mid);
	build0(w,L,rs,mid+1,r);
	tree[w][x]=((long long int)tree[w][ls]*tree[w][rs])%mod;
	return;
}
void update(int w,int x,int l,int r){
	if(l==r){
		tree[w][x]=((long long int)tree[w*2][x]*tree[w*2+1][x])%mod;
		return;
	}
	update(w,ls,l,mid);
	update(w,rs,mid+1,r);
	tree[w][x]=((long long int)tree[w][ls]*tree[w][rs])%mod;
}
void build(int x,int l,int r){
	if(l==r){
		build0(x,l,1,1,n);
		return;
	}
	build(ls,l,mid);
	build(rs,mid+1,r);
	update(x,1,1,n);
	return;
}
int q0(int t,int x,int l,int r,int L,int R){
	if(R<l||r<L)return 1;
	if(L<=l&&r<=R)return tree[t][x];
	return ((long long int)q0(t,ls,l,mid,L,R)*q0(t,rs,mid+1,r,L,R))%mod;
}
int q(int x,int l,int r,int x_1,int x_2,int y_1,int y_2){
	if(y_2<l||r<y_1)return 1;
	if(y_1<=l&&r<=y_2)return q0(x,1,1,n,x_1,x_2);
	return ((long long int)q(ls,l,mid,x_1,x_2,y_1,y_2)*q(rs,mid+1,r,x_1,x_2,y_1,y_2))%mod;
}
int main(){
	freopen("tsuki.in","r",stdin);
	freopen("tsuki.out","w",stdout);
	n=read(),m=read(),mod=read();
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			a[i][j]=read();
	build(1,1,m);
	T=read();
	for(int i=1;i<=T;i++){
		int x_1,x_2,y_1,y_2;
		x_1=read(),y_1=read(),x_2=read(),y_2=read();
		ans=((long long int)ans+(i^q(1,1,m,x_1,x_2,y_1,y_2)))%P;
	}
	printf("%d",ans);
	return 0;
} /*
5 5 14
1 11 5 11 1
3 9 11 2 2
13 1 9 7 13
5 3 5 3 11
5 9 9 13 2
5
1 3 5 4
5 4 5 4
5 1 5 5
1 2 3 4
3 1 3 4

*/
